package com.ohimy.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.LockMode;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;

/**
 * 基础dao接口
 * 
 * @author Tony Tang
 * 
 * @param <T>
 *            Entity
 * @param <PK>
 *            Primary Key
 */
public interface IGenericDao<T extends Serializable, PK extends Serializable> {

	/**
	 * 通过主键获取实体
	 * 
	 * @param id
	 * @return T entity
	 */
	T get(PK id);

	/**
	 * 通过主键获得实体并加锁
	 * 
	 * @param id
	 * @param mode
	 * @return
	 */
	T getWithLock(PK id, LockMode mode);

	/**
	 * 通过主键获得实体
	 * 
	 * @param id
	 * @return
	 */
	T load(PK id);

	/**
	 * 通过主键获得实体并加锁
	 * 
	 * @param id
	 * @param mode
	 * @return
	 */
	T loadWithLock(PK id, LockMode mode);

	/**
	 * 保存实体
	 * 
	 * @param entity
	 * @return
	 */
	Long save(T entity);

	void persist(T entity);

	/**
	 * 保存或更新实体
	 * 
	 * @param entity
	 * @return
	 */
	T saveOrUpdate(T entity);

	Long merge(T entity);

	/**
	 * 更新实体
	 * 
	 * @param entity
	 * @return
	 */
	T update(T entity);

	/**
	 * 删除实体
	 * 
	 * @param entity
	 */
	void delete(T entity);

	/**
	 * 强制立即更新缓存到数据库
	 */
	void flush();

	/**
	 * 刷新
	 * 
	 * @param entity
	 */
	void refresh(T entity);

	/**
	 * 获得全部实体
	 * 
	 * @return
	 */
	List<T> findAll();

	/**
	 * 根据例子,获取实体
	 * 
	 * @param exampleEntity
	 * @return
	 */
	List<T> findByExample(T exampleEntity);

	/**
	 * 根据例子,获取实体
	 * 
	 * @param exampleEntity
	 * @param excludeProperty
	 * @return
	 */
	List<T> findByExample(T exampleEntity, String[] excludeProperty);

	List<T> findLikeEntity(T entity, String[] propertyNames);

	@SuppressWarnings("unchecked")
	List findByHQL(String hql);

	List<T> findByCriteria(int firstResult, int maxResults, Order order,
			Criterion... criterions);

	List<T> findByCriteria(DetachedCriteria criteria);

}
